package com.hello.system.service.impl;

import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.HashMap;
import java.util.stream.Collectors;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.hello.system.mapper.UserTemplateUsageMapper;
import com.hello.system.mapper.StationeryTemplatesMapper;
import com.hello.system.domain.UserTemplateUsage;
import com.hello.system.domain.StationeryTemplates;
import com.hello.system.service.IUserTemplateUsageService;

/**
 * 用户模板使用记录Service业务层处理
 * 
 */
@Service
public class UserTemplateUsageServiceImpl implements IUserTemplateUsageService 
{
    @Autowired
    private UserTemplateUsageMapper userTemplateUsageMapper;
    
    @Autowired
    private StationeryTemplatesMapper stationeryTemplatesMapper;

    /**
     * 查询用户模板使用记录
     * 
     * @param id 用户模板使用记录主键
     * @return 用户模板使用记录
     */
    @Override
    public UserTemplateUsage selectUserTemplateUsageById(Long id)
    {
        return userTemplateUsageMapper.selectUserTemplateUsageById(id);
    }

    /**
     * 查询用户模板使用记录列表
     * 
     * @param userTemplateUsage 用户模板使用记录
     * @return 用户模板使用记录
     */
    @Override
    public List<UserTemplateUsage> selectUserTemplateUsageList(UserTemplateUsage userTemplateUsage)
    {
        return userTemplateUsageMapper.selectUserTemplateUsageList(userTemplateUsage);
    }

    /**
     * 新增用户模板使用记录
     * 
     * @param userTemplateUsage 用户模板使用记录
     * @return 结果
     */
    @Override
    public int insertUserTemplateUsage(UserTemplateUsage userTemplateUsage)
    {
        userTemplateUsage.setCreatedAt(new Date());
        userTemplateUsage.setUpdatedAt(new Date());
        return userTemplateUsageMapper.insertUserTemplateUsage(userTemplateUsage);
    }

    /**
     * 修改用户模板使用记录
     * 
     * @param userTemplateUsage 用户模板使用记录
     * @return 结果
     */
    @Override
    public int updateUserTemplateUsage(UserTemplateUsage userTemplateUsage)
    {
        userTemplateUsage.setUpdatedAt(new Date());
        return userTemplateUsageMapper.updateUserTemplateUsage(userTemplateUsage);
    }

    /**
     * 批量删除用户模板使用记录
     * 
     * @param ids 需要删除的用户模板使用记录主键
     * @return 结果
     */
    @Override
    public int deleteUserTemplateUsageByIds(Long[] ids)
    {
        return userTemplateUsageMapper.deleteUserTemplateUsageByIds(ids);
    }

    /**
     * 删除用户模板使用记录信息
     * 
     * @param id 用户模板使用记录主键
     * @return 结果
     */
    @Override
    public int deleteUserTemplateUsageById(Long id)
    {
        return userTemplateUsageMapper.deleteUserTemplateUsageById(id);
    }
    
    /**
     * 检查用户使用模板是否免费
     * 
     * @param userId 用户ID
     * @param templateId 模板ID
     * @return 是否免费
     */
    @Override
    public boolean isFreeTemplateUsage(Long userId, Long templateId)
    {
        int usageCount = getUsageCount(userId, templateId);
        // 前三次使用是免费的
        return usageCount < 3;
    }
    
    /**
     * 记录用户使用模板
     * 
     * @param userId 用户ID
     * @param templateId 模板ID
     * @return 结果
     */
    @Override
    public int recordTemplateUsage(Long userId, Long templateId)
    {
        return userTemplateUsageMapper.incrementUsageCount(userId, templateId);
    }
    
    /**
     * 获取用户使用模板次数
     * 
     * @param userId 用户ID
     * @param templateId 模板ID
     * @return 使用次数
     */
    @Override
    public int getUsageCount(Long userId, Long templateId)
    {
        UserTemplateUsage usage = userTemplateUsageMapper.selectUserTemplateUsageByUserIdAndTemplateId(userId, templateId);
        return usage != null ? usage.getUsageCount() : 0;
    }
    
    /**
     * 获取用户对所有模板的使用情况
     *
     * @param userId 用户ID
     * @return 模板ID与使用次数的映射
     */
    @Override
    public Map<Long, Integer> getUserAllTemplateUsage(Long userId) {
        // 1. 获取所有模板列表
        StationeryTemplates queryParam = new StationeryTemplates();
        queryParam.setIsActive(1); // 只查询激活的模板
        List<StationeryTemplates> allTemplates = stationeryTemplatesMapper.selectStationeryTemplatesList(queryParam);
        
        // 2. 查询用户的模板使用记录
        UserTemplateUsage usageParam = new UserTemplateUsage();
        usageParam.setUserId(userId);
        List<UserTemplateUsage> userUsages = userTemplateUsageMapper.selectUserTemplateUsageList(usageParam);
        
        // 3. 将用户使用记录转换为Map，方便查询
        Map<Long, Integer> usageMap = userUsages.stream()
                .collect(Collectors.toMap(
                    UserTemplateUsage::getTemplateId,
                    UserTemplateUsage::getUsageCount
                ));
        
        // 4. 为所有模板填充使用次数，没有使用记录的设置为0
        Map<Long, Integer> result = new HashMap<>();
        for (StationeryTemplates template : allTemplates) {
            Long templateId = template.getTemplateId();
            result.put(templateId, usageMap.getOrDefault(templateId, 0));
        }
        
        return result;
    }

    /**
     * 获取用户总使用模板次数
     *
     * @param userId 用户ID
     * @return 使用次数
     */
    @Override
    public int getTotalUsageCount(Long userId)
    {
        return userTemplateUsageMapper.selectTotalUsageByUserId(userId);
    }
} 